import { useMemberStore } from "@/stores";

/*

测试intercepter进行请求的拦截

*/

// 此基础地址外部提供 -- 可以使用自己的地址
// const baseURL = "http://pcapi-xiaotuxian-front-devtest.itheima.net";
const baseURL = "http://localhost:8080";

/**
 * 拦截器，拦截uni.的几种方法，
 */
const httpIntercepter = {
  // 访问前进行处理
  invoke(args: UniApp.RequestOptions) {
    console.log("进入拦截器");

    // 非 http 开头拼接一次地址
    if (args.url.startsWith("http") == false) {
      console.log("填充一次url");

      args.url = baseURL + args.url;
    }

    // 超时时间
    args.timeout = 10000;

    // 添加请求头
    args.header = {
      ...args.header,
      "source-client": "miniapp",
    };
    // 添加token标识
    const memberStore = useMemberStore();
    // 验证会员本地持久化信息profile是否为空后，在进行token的获取，然后再进行异常处理
    const token = "Bearer" + memberStore.profile?.authorization;
    if (token) {
      args.header.Authorization = token;
    }

    console.log("拦截到的arg为", args);
  },
};

uni.addInterceptor("request", httpIntercepter);
uni.addInterceptor("uploadFile", httpIntercepter);

// const res = await

interface Data<T> {
  code: string;
  msg: string;
  result: T;
}

interface DataR2<T> {
  code: number;
  msg: string;
  data: T;
}

// 自定义封装请求函数
// Promise是由ts提供的一个模板的类型，这个函数名称给不可以修改为别的

/**
 * options中，是对uniapi的封装，
 * 建议请求参数为：
 * method、url、data，data是请求的查询参数
 * @param options
 * @returns
 */
export const http = <T>(options: UniApp.RequestOptions) => {
  return new Promise<Data<T>>((resolve, reject) => {
    // 发送请求处理
    uni.request({
      ...options,
      success(
        res // 成功请求的回调
      ) {
        //res: 是一个请求的返回值，由uni-app提供的一个类型
        if (res.statusCode === 200) {
          resolve(res.data as Data<T>); // 添加一个断言
        } else if (res.statusCode === 401) {
          // 清除本地的持化
          const memberStore = useMemberStore();
          memberStore.clearProfile();
          // 跳转或者重定向
          uni.navigateTo({ url: "pages/login/login" });
          reject(res.data as Data<T>);
        } else {
          // 其他状态码
          uni.showToast({
            icon: "none",
            title: (res.data as Data<T>).msg || "未知的请求错误，请联系管理员",
          });
          reject(res.data as Data<T>);
        }
      },
      fail(res) {
        // 网络访问失败-用户问题
        uni.showToast({
          icon: "none",
          title: "网络连接错误",
        });
        reject(res);
      },
    });
  });
};

/**
 * http第二个请求函数
 * @param options
 * @returns
 */
export const httpR2 = <T>(options: UniApp.RequestOptions) => {
  return new Promise<DataR2<T>>((resolve, reject) => {
    // 发送请求处理
    uni.request({
      ...options,
      success(
        res // 成功请求的回调
      ) {
        //res: 是一个请求的返回值，由uni-app提供的一个类型
        if (res.statusCode === 200) {
          resolve(res.data as DataR2<T>); // 添加一个断言
        } else if (res.statusCode === 401) {
          console.log("401未认证");
          // 清除本地的持化
          const memberStore = useMemberStore();
          memberStore.clearProfile();
          // 跳转或者重定向
          uni.navigateTo({ url: "/pages/login/login" });
          reject(res.data as DataR2<T>);
        } else {
          // 其他状态码
          uni.showToast({
            icon: "none",
            title:
              (res.data as DataR2<T>).msg || "未知的请求错误，请联系管理员",
          });
          reject(res.data as DataR2<T>);
        }
      },
      fail(res) {
        // 网络访问失败-用户问题
        uni.showToast({
          icon: "none",
          title: "网络连接错误",
        });
        reject(res);
      },
    });
  });
};
